package android.slc.appbase.repository.remote;

import android.slc.appbase.api.slc.callback.po.SlcEntity;
import android.slc.appbase.entity.AppPage;
import android.slc.box.adapter.PageModel;
import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.functions.Function;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

/**
 * @author slc
 * @date 2021/2/20 16:00
 */
public class PageTransformUtils {
    /**
     * pageModel转成成另一个pageModel
     *
     * @param input
     * @param <R>
     * @return
     */
    public static <R> PageModel<R> pageModel2TargetRPageModel(PageModel<?> input) {
        PageModel<R> rPageModel = new PageModel<>();
        rPageModel.setIsLastPage(input.getIsLastPage());
        rPageModel.setSearchCount(input.isSearchCount());
        rPageModel.setCurrent(input.getCurrent());
        rPageModel.setSize(input.getSize());
        rPageModel.setPages(input.getPages());
        rPageModel.setTotal(input.getTotal());
        return rPageModel;
    }

    /**
     * 保证返回类型pageModel不是空
     *
     * @param <T>
     * @return
     */
    public static <T> Function<SlcEntity<PageModel<T>>, SlcEntity<PageModel<T>>> pageModelGuaranteedNotEmpty() {
        return pageSlcEntity -> {
            if (pageSlcEntity.isSuccess() && pageSlcEntity.getData() == null) {
                PageModel<T> pageModel = new PageModel<>();
                pageSlcEntity.setData(pageModel);
            }
            return pageSlcEntity;
        };
    }

    /**
     * 获取pageModel的返回类型
     *
     * @param <T>
     * @return
     */
    public static <T> SlcEntity<PageModel<T>> getPageModelResult() {
        return SlcEntity.getSlcEntityByData(new PageModel<>());
    }

    /**
     * 将list装换成pager
     *
     * @param <T>
     * @return
     */
    public static <T> Function<SlcEntity<List<T>>, SlcEntity<PageModel<T>>> list2PageModelMap() {
        return list2PageModelMap(false);
    }

    /**
     * 淦淦淦淦淦淦淦
     * 此处转换器用于傻逼后台不返回Pager信息，让客户端根据返回的list是否有数据来判断是否有下一页的场景
     *
     * @param autoFillVirtualPage 是否自动填充虚拟pager信息
     * @param <T>
     * @return
     */
    public static <T> Function<SlcEntity<List<T>>, SlcEntity<PageModel<T>>> list2PageModelMap(boolean autoFillVirtualPage) {
        return pageSlcEntity -> {
            SlcEntity<PageModel<T>> returnSlcEntity = new SlcEntity<>();
            returnSlcEntity.setCode(pageSlcEntity.getCode());
            PageModel<T> pageModel = new PageModel<>();
            returnSlcEntity.setData(pageModel);
            List<T> listData = pageSlcEntity.getData();
            if (listData == null) {
                listData = new ArrayList<>();
            }
            if (autoFillVirtualPage && !listData.isEmpty()) {
                //虚拟pager信息，虽然数据是假的，但是能保证可以告知View加载更多和到了最后一页
                pageModel.setPages(2);
                pageModel.setCurrent(1);
                pageModel.setTotal(listData.size() + 1);
            } else {
                pageModel.setPages(1);
                pageModel.setCurrent(1);
                pageModel.setTotal(listData.size());
                pageModel.setIsLastPage(true);
            }
            pageModel.setSize(listData.size());
            pageModel.setList(listData);
            return returnSlcEntity;
        };
    }

    /**
     * pageModel转list
     *
     * @param <T>
     * @return
     */
    public static <T> Function<SlcEntity<PageModel<T>>, SlcEntity<List<T>>> pageModel2ListMap() {
        return PageTransformUtils::pageModel2List;
    }

    /**
     * pageModel转list
     *
     * @param pageModelSlcEntity
     * @param <T>
     * @return
     */
    public static <T> SlcEntity<List<T>> pageModel2List(SlcEntity<PageModel<T>> pageModelSlcEntity) {
        SlcEntity<List<T>> slcEntity = DataTransformUtils.slcEntity2TargetRSlcEntity(pageModelSlcEntity);
        if (slcEntity.isSuccess()) {
            if (pageModelSlcEntity.getData() != null) {
                slcEntity.setData(pageModelSlcEntity.getData().getListNoNull());
            }
        }
        return slcEntity;
    }

    /**
     * page转pageModel
     *
     * @param <T>
     * @return
     */
    public static <T> Function<SlcEntity<AppPage<T>>, SlcEntity<PageModel<T>>> page2PageModel() {
        return new Function<SlcEntity<AppPage<T>>, SlcEntity<PageModel<T>>>() {
            @Override
            public SlcEntity<PageModel<T>> apply(@NonNull SlcEntity<AppPage<T>> pageSlcEntity) throws Exception {
                SlcEntity<PageModel<T>> slcEntity = DataTransformUtils.slcEntity2TargetRSlcEntity(pageSlcEntity);
                AppPage<T> appPage = pageSlcEntity.getData();
                PageModel<T> pageModel = new PageModel<>();
                slcEntity.setData(pageModel);
                if (appPage != null) {
                    pageModel.setTotal(appPage.getTotal());
                    pageModel.setIsLastPage(appPage.isLastPage());
                    pageModel.setPages(appPage.getPages());
                    pageModel.setCurrent(appPage.getCurrent());
                    pageModel.setSize(appPage.getSize());
                    pageModel.setRecords(appPage.getRows());
                }
                return slcEntity;
            }
        };
    }

    /**
     * Page item转Page target Item
     *
     * @param <T>
     * @return
     */
    public static <T, R> Function<SlcEntity<PageModel<T>>, SlcEntity<PageModel<R>>> transitionTargetPageMap() {
        return transitionTargetPageMap(null);
    }

    /**
     * Page item转Page target Item
     *
     * @param <T>
     * @return
     */
    public static <T, R> Function<SlcEntity<PageModel<T>>, SlcEntity<PageModel<R>>> transitionTargetPageMap(DataTransformUtils.TransitionDisturb<T> transitionDisturb) {
        return new Function<SlcEntity<PageModel<T>>, SlcEntity<PageModel<R>>>() {
            @Override
            public SlcEntity<PageModel<R>> apply(@NotNull SlcEntity<PageModel<T>> pageSlcEntity) {
                PageModel<T> pageModel = pageSlcEntity.getData();
                if (pageSlcEntity.isSuccess() && pageModel == null) {
                    pageModel = new PageModel<>();
                    pageSlcEntity.setData(pageModel);
                }
                SlcEntity<PageModel<R>> pageSelectBoxSlcEntity = new SlcEntity<>();
                pageSelectBoxSlcEntity.setStatus(pageSlcEntity.getStatus());
                pageSelectBoxSlcEntity.setMsg(pageSlcEntity.getMsg());
                PageModel<R> selectBoxPageModel = PageTransformUtils.pageModel2TargetRPageModel(pageModel);
                selectBoxPageModel.setRecords(DataTransformUtils.itemTransitionTargetList(pageModel.getListNoNull(), transitionDisturb));
                pageSelectBoxSlcEntity.setData(selectBoxPageModel);
                return pageSelectBoxSlcEntity;
            }
        };
    }


}
